
(* Les differentes operation possible sont represente par ce type *)
type op =
	|Egal
	|Different
	|Inf
	|Inf_eq
	|Sup
	|Sup_eq
	|Somme
	|Soustraction
	|Multiplication
	|Division
	|Modulo
	|Et
	|Ou
	
(* Les different type qu peut avoir une valeur *)
type typev = 
	| Void
	| Entier
	| Caractere
	| Pointeur of typev (* On a un pointeur de type. Exemple pointeur (pointeur(Entier)) *)
	| Type_struct of string (* Une structure a un nom. *)
	| Type_union of string (* Une union a un nom aussi *)

(* Le type complexe c'est un gros les tableaux. la liste d'entier c'est la taille des tableaux *)	
type cplx =
	| Type_complexe of typev * int list

(* Toute les expression *)	
type expr =
	(* Une expression vide, qui ne fait rien*)
	|NOP
	|Cst of int
	|Car of char
	|Chaine of string
	|Ident of string
	|Assignation of expr * expr
	|Binop of op * expr * expr
	(* On fait ppel a la fonction du nom string avec comme parametre la liste des expr *)
	|Appel_fun of string * expr list
	(* Pour acceder a la case d'un tableau. le [nombre] *)
	|Acces_tableau of expr * expr
	(* Pour acceder a la valeur d'un pointeur. Le *var *)
	|Acces_pointeur of expr
	(* Pour acceder a une des valeurs du pointeur de struct. Le var->x *)
	|Contenu_pointeur of expr * string
	(* Pour acceder a une des valeur du struct. le var.x *)
	|Contenu_variable of expr * string
	|Reference of expr
	|Non of expr
	|Plus_Plus_Expr of expr
	|Moins_Moins_Expr of expr
	|Expr_Plus_Plus of expr
	|Expr_Moins_Moins of expr
	|Sizeof of cplx

(* Les differente variable *)
type var =
	| Identificateur of string
	| Pointeur_var of var
	| Tableau of var * int
	

type args =
	| Argument of var * typev
	
type instr_declaration = 
	| Declaration_var_g of var * typev
	| Declaration_fun of string * typev * args list * instr
	| Struct of string * (var * typev) list
	| Union of string * (var * typev) list
and
instr =
	|Expression of expr
	|Bloc of instr_declaration list * instr list
	|If of expr * instr * instr
	|While of expr * instr
	|For of expr list * expr * expr list * instr
	|Retour of expr


(* Notre type principale retourne par le parser. *)		
type instr_declaration_list = instr_declaration list

